package com.yayo.mangement.utils;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

/**
 * @desc: AES加密
 * @author: yang
 * @date: 2022/9/6
 */
public class AESEncrypt {

    //秘钥不允许修改，否则会导致以前的解密错误
    public static String  KEY = "aDd35gG4&1bh%0i=";

    /**
     * 加密
     * @param data
     * @return
     * @throws Exception
     */
    public static String encrypt(String data) {
        try{
            if (KEY == null) {
                return null;
            }
            // 判断Key是否为16位
            if (KEY.length() != 16) {
                return null;
            }
            byte[] raw = KEY.getBytes();
            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");//"算法/模式/补码方式"
            IvParameterSpec iv = new IvParameterSpec(KEY.getBytes());//使用CBC模式，需要一个向量iv，可增加加密算法的强度
            cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
            byte[] encrypted = cipher.doFinal(data.getBytes());
            return new BASE64Encoder().encode(encrypted);//此处使用BASE64做转码功能，同时能起到2次加密的作用。
        } catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }


    /**
     * 解密
     * @param data
     * @return
     */
    public static String desEncrypt(String data) {
        try {
            // 判断Key是否为空
            if (KEY == null) {
                return null;
            }
            // 判断Key是否为16位
            if (KEY.length() != 16) {
                return null;
            }
            byte[] raw = KEY.getBytes("ASCII");
            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            IvParameterSpec iv = new IvParameterSpec(KEY.getBytes());
            cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
            byte[] encrypted1 = new BASE64Decoder().decodeBuffer(data);//先用base64解密

            byte[] original = cipher.doFinal(encrypted1);
            String originalString = new String(original);
            return originalString;

        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }
    }

}
